package com.tianjishuju.cimiss.station.station.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;

/**
 * <table>
 * <tr>
 * <td>y</td>
 * <td>年</td>
 * <td>Year</td>
 * <td>1996; 96</td>
 * </tr>
 * <tr>
 * <td>M</td>
 * <td>年中的月份</td>
 * <td>Month</td>
 * <td>July; Jul; 07</td>
 * </tr>
 * <tr>
 * <td>w</td>
 * <td>年中的周数</td>
 * <td>Number</td>
 * <td>27</td>
 * </tr>
 * <tr>
 * <td>W</td>
 * <td>月份中的周数</td>
 * <td>Number</td>
 * <td>2</td>
 * </tr>
 * <tr>
 * <td>D</td>
 * <td>年中的天数</td>
 * <td>Number</td>
 * <td>189</td>
 * </tr>
 * <tr>
 * <td>d</td>
 * <td>月份中的天数</td>
 * <td>Number</td>
 * <td>10</td>
 * </tr>
 * <tr>
 * <td>F</td>
 * <td>月份中的星期</td>
 * <td>Number</td>
 * <td>2</td>
 * </tr>
 * <tr>
 * <td>E</td>
 * <td>星期中的天数</td>
 * <td>Text</td>
 * <td>Tuesday; Tue</td>
 * </tr>
 * <tr>
 * <td>a</td>
 * <td>Am/pm 标记</td>
 * <td>Text</td>
 * <td>PM</td>
 * </tr>
 * <tr>
 * <td>H</td>
 * <td>一天中的小时数（0-23）</td>
 * <td>Number</td>
 * <td>0</td>
 * </tr>
 * <tr>
 * <td>k</td>
 * <td>一天中的小时数（1-24）</td>
 * <td>Number</td>
 * <td>24</td>
 * </tr>
 * <tr>
 * <td>K</td>
 * <td>am/pm 中的小时数（0-11）</td>
 * <td>Number</td>
 * <td>0</td>
 * </tr>
 * <tr>
 * <td>h</td>
 * <td>am/pm 中的小时数（1-12）</td>
 * <td>Number</td>
 * <td>12</td>
 * </tr>
 * <tr>
 * <td>m</td>
 * <td>小时中的分钟数</td>
 * <td>Number</td>
 * <td>30</td>
 * </tr>
 * <tr>
 * <td>s</td>
 * <td>分钟中的秒数</td>
 * <td>Number</td>
 * <td>55</td>
 * </tr>
 * <tr>
 * <td>S</td>
 * <td>毫秒数</td>
 * <td>Number</td>
 * <td>978</td>
 * </tr>
 * <tr>
 * <td>z</td>
 * <td>时区</td>
 * <td>General time zone</td>
 * <td>Pacific Standard Time; PST; GMT-08:00</td>
 * </tr>
 * <tr>
 * <td>Z</td>
 * <td>时区</td>
 * <td>RFC 822 time zone</td>
 * <td>-0800
 * </table>
 *
 */
public class DateUtil {

	/**
	 * 日期格式化样式 DATE_YMD： "yyyy-MM-dd"
	 */
	public final static String DATE_YMD = "yyyy-MM-dd";

	/**
	 * 日期格式化样式 DATE_YMD： "yyyy-MM-dd"
	 */
	public final static String DATE_Y = "yyyy";

	/**
	 * 日期格式化样式 DATE_YMDHMS： "yyyy-MM-dd HH:mm:ss"
	 */
	public final static String DATE_YMDHMS = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 页面上的日期格式
	 */
	private final static SimpleDateFormat DATEFMT_YMD = new SimpleDateFormat(DATE_YMD);

	/**
	 * 在时间的天上加i天/月/年……
	 *
	 * @param date
	 *            日期
	 * @param field
	 *            日历的域
	 * @param i
	 *            数量
	 * @return 结果日期
	 */
	public static Date dateAdd(Date date, int field, int i) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(field, i);// 在天上加i天
		return calendar.getTime();
	}

	/**
	 * 把Date类型的日期转换成String类型
	 *
	 * @param date
	 * @param format
	 * @param reValue
	 *            如果日期为空，则返回该值
	 * @return
	 */
	public final static String format(Date date, String format, String reValue) {
		synchronized (DATEFMT_YMD) {
			if (date == null)
				return reValue;

			if (format != null && !"".equals(format))
				DATEFMT_YMD.applyPattern(format);

			return DATEFMT_YMD.format(date);
		}
	}

	/**
	 * @param date
	 *            日期
	 * @param format
	 *            日期转换类型
	 * @return
	 * @description 把Date类型的日期转换成String类型
	 */
	public final static String format(Date date, String format) {
		return format(date, format, null);
	}

	/**
	 * 把Date类型的日期转换成String类型
	 *
	 * @param date
	 * @return 默认返回： yyyy-MM-dd 日期
	 */
	public final static String format(Date date) {
		return format(date, DATE_YMD, null);
	}

	/**
	 * @param dateStr
	 *            日期
	 * @param format
	 *            日期转换格式
	 * @param reValue
	 *            如果日期为空，则返回该值
	 * @return 返回date类型日期
	 * @description 把String类型的日期转换成Date类型
	 */
	public final static Date format(String dateStr, String format, Date reValue) {
		synchronized (DATEFMT_YMD) {
			try {
				if (format != null && !"".equals(format))
					DATEFMT_YMD.applyPattern(format);

				if (dateStr != null && !"".equals(dateStr))
					return DATEFMT_YMD.parse(dateStr);
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		return reValue;
	}

	/**
	 * @param dateStr
	 *            日期
	 * @param format
	 *            日期转换格式
	 * @return 返回date类型日期
	 * @description 把String类型的日期转换成Date类型
	 */
	public final static Date format(String dateStr, String format) {
		return format(dateStr, format, null);
	}

	/**
	 * @param dateStr
	 *            日期
	 * @return 返回date类型日期（默认返回： yyyy-MM-dd 日期）
	 * @description 把String类型的日期转换成Date类型
	 */
	public final static Date format(String dateStr) {
		return format(dateStr, DATE_YMD, null);
	}

	/**
	 * 把String类型的日期转换成Date类型
	 * 
	 * @param timeMillis
	 * @return 默认返回： yyyy-MM-dd 日期
	 */
	public final static String format(long timeMillis) {
		Date date = new Date(timeMillis);
		return format(date, DATE_YMD);
	}

	public final static String format(long timeMillis, String format) {
		Date date = new Date(timeMillis);
		return format(date, format);
	}

	public final static String format(long timeMillis, String format, String reValue) {
		Date date = new Date(timeMillis);
		return format(date, format, reValue);
	}

	/*
	 * 将时间转换为时间戳
	 */
	public static long dateToStamp(String s) throws ParseException {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
		Date date = simpleDateFormat.parse(s);
		long res = date.getTime();
		return res;
	}

	/*
	 * 将时间戳转换为时间
	 */
	public static String stampToDate(Long s) {
		String res;
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
		Date date = new Date(s);
		res = simpleDateFormat.format(date);
		return res;
	}

	/**
	 * 加一天 
	 */
	public static String addDay(String dataString, int daynum) {
		Calendar c = Calendar.getInstance();

		c.setTime(format(dataString, "yyyyMMddHHmmss"));

		c.add(Calendar.DAY_OF_MONTH, daynum);// 今天+1天

		Date tomorrow = c.getTime();

		return format(tomorrow, "yyyyMMddHHmmss");
	}

	/**
	 * 加1小时 HOUR_OF_DAY
	 */
	public static String addHour(String dataString, int hournum) {
		Calendar c = Calendar.getInstance();

		c.setTime(format(dataString, "yyyyMMddHHmmss"));

		c.add(Calendar.HOUR_OF_DAY, hournum);// 今天+1天

		Date tomorrow = c.getTime();

		return format(tomorrow, "yyyyMMddHHmmss");
	}

	/**
	 * 时间扩充并标准化 09 -》 00，06 入参：当前时间 cur -> yyyyMMddHHmmss 出参：标准化的起始时间
	 * yyyyMMddHHmmss-> yyyyMMddHHmmss-6,yyyyMMddHHmmss
	 */
	public static String cutcurDate(String curTime) {

		// 时间标准化 向前扩充
		// 00 06 12 18 24 30 36 42 48 54 60
		// 00 10 20 30 40 50 60
		String endyear = curTime.substring(0, 4);
		String endmm = curTime.substring(4, 6);
		String enddd = curTime.substring(6, 8);
		String endhh = curTime.substring(8, 10);
		String endmin = curTime.substring(10, 12);

		ArrayList<String> subTimeList = new ArrayList<String>();
		// 单站 组网 分钟值
		subTimeList.add("00");
		subTimeList.add("06");
		subTimeList.add("12");
		subTimeList.add("18");
		subTimeList.add("24");
		subTimeList.add("30");
		subTimeList.add("36");
		subTimeList.add("42");
		subTimeList.add("48");
		subTimeList.add("54");
		subTimeList.add("60");
		// } else {
		// subTimeList.add("00");
		// subTimeList.add("10");
		// subTimeList.add("20");
		// subTimeList.add("30");
		// subTimeList.add("40");
		// subTimeList.add("50");
		// subTimeList.add("60");
		// }
		Collections.sort(subTimeList);
		// 计算直接间隔 毫秒 ms
		if ((!curTime.equals("")) && (!curTime.equals("")) && (curTime.compareTo(curTime) == 0)) {
			// 20180601 05
			// 20180601 55

			// 00 06 12 18 24 30 36 42 48 54 60
			// 00 10 20 30 40 50 60
			// endmin 向前扩充6分钟 最小为 00
			if (!subTimeList.contains(endmin)) {
				for (int i = 0; i < subTimeList.size() - 1; i++) {
					if ((subTimeList.get(i).compareTo(endmin) < 0) && (subTimeList.get(i + 1).compareTo(endmin) > 0)
							&& (i + 1 < subTimeList.size())) {
						endmin = subTimeList.get(i);
					}
				}
			}
			String endTime = endyear + endmm + enddd + endhh + endmin + "00";

			// startmin = endmin - 6 最小为 54 , 000100
			String startyear = endTime.substring(0, 4);
			String startmm = endTime.substring(4, 6);
			String startdd = endTime.substring(6, 8);
			String starthh = endTime.substring(8, 10);
			String startmin = endTime.substring(10, 12);

			// 00 06 12 18 24 30 36 42 48 54 60
			// 起始时间 = 终止时间 - 6分钟
			if (startmin.equals("00")) {
				startmin = "54";
				// 小时 - 1 , 00 01 09 10 11 - 23
				if (starthh.equals("00")) {
					starthh = "23";
					// dd - 1
					String endTimeTemp = DateUtil.addDay(startyear + startmm + startdd + "235400", -1);
					endyear = endTimeTemp.substring(0, 4);
					endmm = endTimeTemp.substring(4, 6);
					enddd = endTimeTemp.substring(6, 8);
					endhh = endTimeTemp.substring(8, 10);
					endmin = endTimeTemp.substring(10, 12);
				} else {
					if (Integer.valueOf(endhh) <= 10) {
						starthh = "0" + String.valueOf((Integer.valueOf(starthh) - 1));
					} else {
						starthh = String.valueOf((Integer.valueOf(starthh) - 1));
					}
				}
			} else {
				// 06 12 18 24 30 36 42 48 54 60
				// startmin = endmin - 6
				if (Integer.valueOf(startmin) <= 12) {
					startmin = "0" + String.valueOf((Integer.valueOf(startmin) - 6));
				} else {
					startmin = String.valueOf((Integer.valueOf(startmin) - 6));
				}
			}
			String startTime = startyear + startmm + startdd + starthh + startmin + "00";
			return startTime + "," + endTime;
		} else {
			return "";
		}
	}
}